package sudoku.server.dominio;

import java.rmi.RemoteException;
import java.util.Enumeration;
import java.util.Hashtable;

import sudoku.client.comunicaciones.IJugador;
import sudoku.server.comunicaciones.Notificador;
import sudoku.server.comunicaciones.StubJugador;
import sudoku.server.persistencia.FachadaPersistencia;
import sudoku.server.persistencia.TableroDAO;
import sudoku.server.presen.JFServer;

public class Sudoku extends Tablero{
	protected Cuadricula[] cuadriculas;

	public Sudoku() {
		cuadriculas=new Cuadricula[9];
		for (int i=0; i<9; i++)
			cuadriculas[i]=new Cuadricula();
		this.dao=FachadaPersistencia.getSudokuDAO(this);
	}
	public Sudoku(String id) throws Exception {
		this();
		this.dao.getTablero(id);
	}
	
	public void setNumeros(String ristra) {
		byte fila=0, columna=-1;
		for (byte i=0; i<ristra.length(); i++) {
			String c=""+ristra.charAt(i);
			byte idCuadricula=(byte) (i/9);
			if (idCuadricula>0 && i%9==0) {
				fila=0;
				columna=0;
			} else {
				columna++;
				if (columna==3) {
					fila++;
					columna=0;
				}
			}
			if (c.equals(" "))
				cuadriculas[idCuadricula].colocar(fila, columna, (byte) 0);
			else {
				final byte b=Byte.parseByte(c);
				cuadriculas[idCuadricula].colocar(fila, columna, b);
			}
		}
	}

	public String toString() {
		String result="";
		for (int i=0; i<9; i++) {
			result+=cuadriculas[i].toString();
		}
		return result;
	}


	public void poner(byte idCuadricula, byte fila, byte columna, byte numero) throws RemoteException {
		if (numero>=0 && numero<=9) {
			this.cuadriculas[idCuadricula].colocar(fila, columna, numero);
			update();
			notificar();
		}
	}
	
	public void quitar(byte idCuadricula, byte fila, byte columna) throws RemoteException {
		this.cuadriculas[idCuadricula].colocar(fila, columna, (byte) 0);
		update();
		notificar();
	}
	
	public void insert() throws Exception {
		this.dao.insert(this.toString());
	}

	protected void update() throws RemoteException {
		try {
			this.dao.update();
		} catch (Exception e) {
			throw new RemoteException(e.toString());
		}
	}

}

	